#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Spark内存计算 - 学生信息管理系统
作业要求:
(1) 根据老师提供的学生点名册，使用Python程序创建学生对象，并将学生信息读入并存储到相应对象中。
(2) 根据输入的学生学号，查询并打印对应的学生信息。
(3) 统计全班成绩的平均分和最高分。
"""

import os

class Student:
    """学生类，用于存储学生信息"""
    
    def __init__(self, student_id, name, class_name, gender, score):
        """初始化学生对象"""
        self.student_id = student_id    # 学号
        self.name = name                # 姓名
        self.class_name = class_name    # 班级
        self.gender = gender            # 性别
        self.score = score              # 成绩
    
    def __str__(self):
        """返回学生信息的字符串表示"""
        return f"学号: {self.student_id}, 姓名: {self.name}, 班级: {self.class_name}, 性别: {self.gender}, 成绩: {self.score}"
    
    def display_info(self):
        """打印学生信息"""
        print(f"学号: {self.student_id}")
        print(f"姓名: {self.name}")
        print(f"班级: {self.class_name}")
        print(f"性别: {self.gender}")
        print(f"成绩: {self.score}")


def read_student_data(file_path):
    """
    从文件中读取学生数据并创建学生对象
    
    Args:
        file_path (str): 学生数据文件路径
        
    Returns:
        list: 学生对象列表
    """
    students = []
    
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            for line in file:
                line = line.strip()
                if not line:  # 跳过空行
                    continue
                
                # 解析CSV格式的学生数据
                fields = line.split(',')
                if len(fields) != 5:
                    print(f"警告：跳过无效的行: {line}")
                    continue
                
                try:
                    # 创建学生对象并添加到列表
                    student = Student(
                        student_id=fields[0].strip(),
                        name=fields[1].strip(),
                        class_name=fields[2].strip(),
                        gender=fields[3].strip(),
                        score=int(fields[4].strip())
                    )
                    students.append(student)
                except ValueError as e:
                    print(f"警告：解析学生数据失败: {line}, 错误: {e}")
        
        print(f"成功加载 {len(students)} 名学生信息")
        return students
    
    except Exception as e:
        print(f"读取学生数据时发生错误: {e}")
        return []


def query_student_by_id(students, student_id):
    """
    根据学号查询学生信息
    
    Args:
        students (list): 学生对象列表
        student_id (str): 要查询的学号
        
    Returns:
        Student或None: 查询到的学生对象，未找到则返回None
    """
    for student in students:
        if student.student_id == student_id:
            return student
    return None


def calculate_score_stats(students):
    """
    统计全班成绩的平均分和最高分
    
    Args:
        students (list): 学生对象列表
        
    Returns:
        tuple: (平均分, 最高分, 获得最高分的学生列表)
    """
    if not students:
        return 0, 0, []
    
    # 计算平均分
    total_score = sum(student.score for student in students)
    average_score = total_score / len(students)
    
    # 计算最高分及获得最高分的学生
    max_score = max(student.score for student in students)
    top_students = [student for student in students if student.score == max_score]
    
    return average_score, max_score, top_students


def find_student_file():
    """
    查找学生数据文件的位置
    
    Returns:
        str: 找到的文件路径，如果没找到则返回None
    """
    # 尝试查找可能的文件位置
    possible_paths = [
        "student.txt",           # 当前目录
        "../student.txt",        # 上一级目录
        "Spark/student.txt",     # Spark子目录
        "./student.txt"          # 显式当前目录
    ]
    
    for path in possible_paths:
        if os.path.exists(path):
            print(f"找到学生数据文件: {path}")
            return path
    
    return None


def main():
    """主函数"""
    print("======= 学生信息管理系统 =======")
    
    # 1. 根据学生点名册，创建学生对象并存储
    file_path = find_student_file()
    
    if not file_path:
        print("错误：未找到学生数据文件 'student.txt'")
        print("请确保文件位于当前目录或上一级目录中")
        return
    
    students = read_student_data(file_path)
    
    if not students:
        print("未能成功加载学生数据，程序退出")
        return
    
    # 2. 根据输入的学生学号，查询并打印对应的学生信息
    student_id = input("\n请输入要查询的学生学号: ").strip()
    student = query_student_by_id(students, student_id)
    
    if student:
        print("\n找到学生信息:")
        student.display_info()
    else:
        print(f"\n未找到学号为 '{student_id}' 的学生")
    
    # 3. 统计全班成绩的平均分和最高分
    avg_score, max_score, top_students = calculate_score_stats(students)
    
    print("\n全班成绩统计:")
    print(f"平均分: {avg_score:.2f}")
    print(f"最高分: {max_score}")
    print(f"获得最高分的学生: {', '.join(student.name for student in top_students)}")


if __name__ == "__main__":
    main() 